<?php
namespace org\net;

use QL\Ext\Lib\Http;

class Cnzz
{

    private $baseUrl = "https://web.umeng.com/main.php?"; //接口请求地址
    private $siteId;
    private $password;
    private $loginUrl;
    private $error;
    private $http;
    private $debug=false;

    /**
     * 初始化
     * Cnzz constructor.
     * @param string $siteId 站点ID
     * @param string $password 查看密码
     */
    function __construct($siteId, $password)
    {
        $this->siteId   = $siteId;
        $this->password = $password;
        $this->loginUrl = "http://new.cnzz.com/v1/login.php?t=login&siteid=" . $this->siteId;
        $Referer = "http://new.cnzz.com/v1/login.php?siteid=" . $this->siteId;
        if($this->debug==true){
            $Referer = 'https://web.umeng.com/demo.php';
            $this->loginUrl = 'https://web.umeng.com/demo.php';
        }
        $httpConfig     = [
            'Accept'                    => 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8',
            'Host'                      => 'new.cnzz.com',
            'Referer'                   => $Referer,
            'User-Agent'                => 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3141.7 Safari/537.36',
            'Upgrade-Insecure-Requests' => '1',
        ];
        $this->http     = new Http();         // 实例化对象
        $this->http->initialize($httpConfig);
        $this->http->setCookiepath(RUNTIME_PATH . "cache/cookie_{$this->siteId}.txt");
    }

    /**
     * 网站概况
     * @return array|string
     */
    public function siteOverview()
    {
        $url    = $this->baseUrl . "c=site&a=overview&ajax=module%3Dsummary";
        $params = [
            'siteid'=>$this->siteId,
            '_'=>$this->createTime()
        ];
        $result = $this->http->get($url,$params);
        $result = json_decode($result, true);
        $result = $this->getResult($result);
        if($result===true){ //又登陆成功
            return $this->siteOverview();
        }
        return $result;
    }

    /**
     * 流量趋势
     * @param string $Period Hour按小时统计 Day按天统计
     * @param string $st 开始日期 0000-00-00 格式
     * @param string $et 结束日期 0000-00-00 格式
     * @return bool|string
     */
    public function flowTrend($Period='Hour', $st = '', $et = '')
    {
        $st     = empty($st) ? date('Y-m-d') : $st;
        $et     = empty($et) ? date('Y-m-d') : $et;
        $url    = $this->baseUrl . "c=flow&a=trend&ajax=module=flash&type=Line&Quota=pv,uv,ip";
        $params = [
            'Period'=>$Period,
            'st'=>$st,
            'et'=>$et,
            'siteid'=>$this->siteId,
            '_'=>$this->createTime()
        ];
        $result = $this->http->get($url,$params);
        $result = json_decode($result, true);
        $result = $this->getResult($result);
        if($result===true){ //又登陆成功
            return $this->flowTrend($Period,$st,$et);
        }
        return $result;
    }

    /**
     * 来源分类
     * @param string $Period
     * @param string $type
     * @param string $st
     * @param string $et
     * @return bool|string
     */
    public function sourceChart($Period='Hour',$type='', $st = '', $et = ''){
        $st     = empty($st) ? date('Y-m-d') : $st;
        $et     = empty($et) ? date('Y-m-d') : $et;
        $url    = $this->baseUrl . "c=traf&a=overview&ajax=module=flash&Quota=pv";
        $params = [
            'type'=>$type,
            'Period'=>$Period,
            'st'=>$st,
            'et'=>$et,
            'siteid'=>$this->siteId,
            '_'=>$this->createTime()
        ];
        $result = $this->http->get($url,$params);
        $result = json_decode($result, true);
        $result = $this->getResult($result);
        if($result===true){ //又登陆成功
            return $this->flowTrend($Period,$type,$st,$et);
        }
        return $result;
    }
    /**
     * 搜索引擎
     * @param string $type Pie 饼图数据 Line 折线图
     * @param string $Period Hour小时 Day天
     * @param string $st 开始日期 0000-00-00 格式
     * @param string $et 结束日期 0000-00-00 格式
     * @param string $Quota pv uv ip newuv sitepv
     * @return bool|string
     */
    public function trafSearch($type='Pie',$Quota='pv',$Period='Hour',$st='',$et=''){
        $st     = empty($st) ? date('Y-m-d') : $st;
        $et     = empty($et) ? date('Y-m-d') : $et;
        $url    = $this->baseUrl . "c=traf&a=search&ajax=module=flash";
        $params = [
            'subTabIndex'=>0,
            'engin'=>'all',
            'siteid'=>$this->siteId,
            'st'=>$st,
            'et'=>$et,
            'type'=>$type,
            'Period'=>$Period,
            'Quota'=>$Quota,
            'search'=>'11,104,2',
            '_'=>$this->createTime()
        ];
        $result = $this->http->get($url,$params);
        $result = json_decode($result, true);
        $result = $this->getResult($result);
        if($result===true){ //又登陆成功
            return $this->trafSearch($type,$Quota,$Period,$st,$et);
        }
        return $result;
    }

    /**
     * 最近15分钟趋势图以及当前在线分析
     * @param string $type Line：最近十五分钟趋势分析，Pie：当前在线分析
     * @param string $Period 时间间隔 Hour小时 Day 天
     * @param string $Quota 统计数据 pv ip uv
     * @return bool|mixed|string
     */
    public function flowRealtime($type='Line',$Period='Hour',$Quota='pv,ip,uv')
    {
        $url    = $this->baseUrl . "c=flow&a=realtime&ajax=module=flash";
        $params = [
            'siteid'=>$this->siteId,
            'type'=>$type,
            'Period'=>$Period,
            'Quota'=>$Quota,
            '_'=>$this->createTime()
        ];
        $result = $this->http->get($url,$params);
        $result = json_decode($result, true);
        $result = $this->getResult($result);
        if($result===true){ //又登陆成功
            return $this->flowRealtime($type,$Period,$Quota);
        }
        return $result;
    }

    /**
     * seo推荐
     * @param string $module 数据类型 newlist:新出现的搜索词 uplist:上升最快搜索词 nearkeyword:相关搜索词
     * @param int $page 页数
     * @param string $st 开始时间 最早为前一天
     * @param string $et 结束时间最早为前一天
     * @param string $orderBy 排序字段
     * @param int $orderType 排序方式 1增序 -1 减序
     * @return bool|mixed|string
     */
    public function seo($module='newlist',$page=1,$st='',$et='',$orderBy='opt_value',$orderType=-1)
    {
        $st     = empty($st) ? date('Y-m-d',strtotime('yesterday')) : $st;
        $et     = empty($et) ? date('Y-m-d',strtotime('yesterday')) : $et;
        $url    = $this->baseUrl . "c=traf&a=seo&ajax=module=".$module."_currentPage=".($page-1)."_pageType=30";
        $params = [
            'siteid'=>$this->siteId,
            'st'=>$st,
            'et'=>$et,
            'orderBy'=>$orderBy,
            'orderType'=>$orderType,
            '_'=>$this->createTime()
        ];
        $result = $this->http->get($url,$params);
        $result = json_decode($result, true);
        $result = $this->getResult($result);
        if($result===true){ //又登陆成功
            return $this->seo($page,$st,$et,$orderBy,$orderType);
        }
        return $result;
    }

    /**
     * 访客分析-地区分布
     * @param string $ajaxmodule 获取类型 summary：获取总的浏览数以及每个省的数据排行榜 flash：获取各个省市的数据总和
     * @param string $st 时间 YYYY-MM-DD格式
     * @param string $et 时间 YYYY-MM-DD格式
     * @param string $type Map:按照省分布 Pie:取前五的访问量，剩余的用其他代替
     */
    /**
     * 访客分析-地区分布
     * @param string $ajaxmodule 获取类型 summary：获取总的浏览数以及每个省的数据排行榜 flash：获取各个省市的数据总和
     * @param string $Quota 指标 PV UV IP newuv seeeion
     * @param string $st 时间 YYYY-MM-DD格式
     * @param string $et 时间 YYYY-MM-DD格式
     * @param string $type Map:按照省分布 Pie:取前五的访问量，剩余的用其他代替
     * @param int $page 第几页 $ajaxmodule为summary时有效
     * @param string $module 列表模式 provinceList获取省级列表 如果想获取省以下的列表，这里传每个省的名字，例如 广东省  $ajaxmodule为summary时有效
     * @param string $orderBy 排序字段 pv uv ip newuv(新独立访客) session(访问次数) outper(跳出数)
     * @param int $orderType 排序方式 1正序 2 倒序
     * @return bool|mixed|string
     */
    public function districtnet($ajaxmodule='summary',$Quota='pv',$st='',$et='',$type='Map',$page=1,$module='provinceList',$orderBy='pv',$orderType=-1)
    {
        $st     = empty($st) ? date('Y-m-d') : $st;
        $et     = empty($et) ? date('Y-m-d') : $et;
        $url    = $this->baseUrl . "c=visitor&a=districtnet&ajax=module=".$ajaxmodule;
        if ($ajaxmodule=='summary'){
            $url.='|module='.$module.'_orderBy='.$orderBy.'_orderType='.$orderType.'_currentPage='.$page.'_pageType=90';
        }else{
            $url.='&moduleType=location&type='.$type.'&Quota='.$Quota;
        }
        $params = [
            'siteid'=>$this->siteId,
            'st'=>$st,
            'et'=>$et,
            '_'=>$this->createTime()
        ];
        $result = $this->http->get($url,$params);
        $result = json_decode($result, true);
        $result = $this->getResult($result);
        if($result===true){ //又登陆成功
            return $this->districtnet($ajaxmodule,$Quota,$st,$et,$type,$page,$module,$orderBy,$orderType);
        }
        return $result;
    }
    /**
     * 登录
     * @param string $password 登录密码
     * @return bool
     */
    public function login()
    {
        if($this->debug==true){
            $this->http->post($this->loginUrl);
        }else{
            $this->http->post($this->loginUrl, ['password' => $this->password]);
        }
        if (strstr(htmlspecialchars($this->http->getResult()), 'main.php') === false) {
            $this->error = '远程通讯失败！';
            return false;
        } else {
            return true;
        }
    }

    /**
     * js时间戳
     */
    private function createTime()
    {
        return time() * 1000;
    }

    /**
     * 获取结果数据
     * @param array $data 获取的数据
     * @return bool|string 是否登陆成功
     */
    private function getResult($result)
    {
        if (isset($result['data']['status']) || empty($result)) { //重新登陆
            if ($this->login()) {
                return true;
            } else {
                $this->error = '登录失败！';
                return false;
            }
        } else {
            return $result;
        }
    }

    /**
     * 捕获错误
     * @return mixed
     */
    public function getError()
    {
        return $this->error;
    }
}